package com.knowledge.plus.创建线程and线程池.普通创建线程;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 创建线程的三种方式
 *
 * @author aFei
 * @since 2022/4/4
 */
public class CreateThreadWay {

    public static void main(String[] args) {
        System.out.println("主线程");

        // 方式1
        Thread way1 = new ThreadWay();
        way1.start();

        // 方式2
        Runnable runnableTask = new RunnableWay();  // 线程任务对象
        Thread way2 = new Thread(runnableTask); // 线程对象
        way2.start();

        // 方式3
        Callable<String> callableWay = new CallableWay();
        FutureTask<String> futureTask = new FutureTask<>(callableWay);
        Thread way3 = new Thread(futureTask);
        way3.start();
        try {
            String returnResult = futureTask.get();
            System.out.println(returnResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

/**
 * 1. 继承Thread 类创建一个子线程
 */
class ThreadWay extends Thread {
    @Override
    public void run() {
        System.out.println("通过继承Thread 类创建一个线程！");
    }
}

/**
 * 实现Runnable 接口创建一个子线程
 * 优点：
 * -- 同一个线程任务对象，可以被包装成多个线程对象
 * -- 适合多个线程去共享同一个资源
 * 缺点：
 * -- 不能直接得到线程执行的结果
 */
class RunnableWay implements Runnable {

    @Override
    public void run() {
        System.out.println("通过实现Runnable 接口创建一个线程！");
    }
}

/**
 * 实现Runnable 接口创建一个子线程
 */
class CallableWay implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("通过实现Callable 接口创建一个线程！");
        return "呼叫总部，我是Callable的子线程，我运行完毕了";
    }
}